package com.gj.tourismcommunity.controller;


import com.gj.tourismcommunity.dto.AuthResponse;
import com.gj.tourismcommunity.dto.LoginRequest;
import com.gj.tourismcommunity.dto.RegisterRequest;
import com.gj.tourismcommunity.entity.User;
import com.gj.tourismcommunity.service.UserService;
import com.gj.tourismcommunity.utils.JwtUtil;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;



@Slf4j
@RestController
@RequestMapping("/api/auth")
@Validated
public class AuthController {
    
    @Autowired
    private UserService userService;
    
    @Autowired
    private JwtUtil jwtUtil;
    
    /**
     * 用户注册接口
 * 处理用户注册请求，包括创建用户、生成JWT Token和返回用户信息
 *
 * @param request 包含用户注册所需信息的请求对象，需要通过@Valid进行校验
 * @return AuthResponse 包含注册状态、消息、JWT Token和用户信息的响应对象
     */
    @PostMapping("/register")
    public AuthResponse register(@Valid @RequestBody RegisterRequest request) {
        try {
            // 创建用户对象并设置基本信息
            User user = new User();
            user.setUsername(request.getUsername());
            user.setEmail(request.getEmail());
            user.setPassword(request.getPassword());
            
            // 注册用户
            User savedUser = userService.register(user);
            
            // 生成JWT Token
            String token = jwtUtil.generateToken(savedUser.getUsername());
            
            // 构建用户信息
            AuthResponse.UserInfo userInfo = new AuthResponse.UserInfo(
                savedUser.getId(),
                savedUser.getUsername(),
                savedUser.getEmail(),
                savedUser.getAvatar(),
                savedUser.getRole()
            );
            
            log.info("用户注册成功: {}", savedUser.getUsername());
            return new AuthResponse(true, "注册成功", token, userInfo);
            
        } catch (RuntimeException e) {
            log.error("用户注册失败: {}", e.getMessage());
            return new AuthResponse(false, e.getMessage());
        }
    }
    
    /**
     * 用户登录接口
 * 该接口用于处理用户登录请求，验证用户信息并生成JWT令牌
 *
 * @PostMapping("/login") 表示这是一个HTTP POST请求，映射到/login路径
 *
 * @param request 包含用户登录信息的请求体，使用@Valid进行参数校验
 * @return 返回一个AuthResponse对象，包含登录状态、消息、令牌和用户信息
     */
    @PostMapping("/login")
    public AuthResponse login(@Valid @RequestBody LoginRequest request) {
        try {
            // 验证用户登录，调用userService的login方法进行用户名和密码验证
            User user = userService.login(request.getUsername(), request.getPassword());
            
            // 生成JWT Token
            String token = jwtUtil.generateToken(user.getUsername());
            
            // 构建用户信息
            AuthResponse.UserInfo userInfo = new AuthResponse.UserInfo(
                user.getId(),
                user.getUsername(),
                user.getEmail(),
                user.getAvatar(),
                user.getRole()
            );
            
            log.info("用户登录成功: {}", user.getUsername());
            return new AuthResponse(true, "登录成功", token, userInfo);
            
        } catch (RuntimeException e) {
            log.error("用户登录失败: {}", e.getMessage());
            return new AuthResponse(false, e.getMessage());
        }
    }
    
    /**
     * 验证Token
 * 该接口用于验证请求头中的Authorization token是否有效
 * @return 返回AuthResponse对象，包含验证结果和用户信息
     */
    @PostMapping("/verify")
    public AuthResponse verifyToken(@RequestHeader("Authorization") String authHeader) {
        try {
        // 检查Authorization header是否存在且以"Bearer "开头
            if (authHeader == null || !authHeader.startsWith("Bearer ")) {
                return new AuthResponse(false, "Token格式错误");
            }
            
        // 提取token部分（去掉"Bearer "前缀）
            String token = authHeader.substring(7);
        // 验证token是否有效和未过期
            if (!jwtUtil.validateToken(token)) {
                return new AuthResponse(false, "Token无效或已过期");
            }
            
        // 从token中获取用户名
            String username = jwtUtil.getUsernameFromToken(token);
        // 根据用户名查找用户
            User user = userService.findByUsername(username);
            if (user == null) {
                return new AuthResponse(false, "用户不存在");
            }
            
        // 构建用户信息对象
            AuthResponse.UserInfo userInfo = new AuthResponse.UserInfo(
                user.getId(),
                user.getUsername(),
                user.getEmail(),
                user.getAvatar(),
                user.getRole()
            );
            
        // 返回成功响应，包含token和用户信息
            return new AuthResponse(true, "Token验证成功", token, userInfo);
            
        } catch (Exception e) {
        // 捕获并记录异常
            log.error("Token验证失败: {}", e.getMessage());
            return new AuthResponse(false, "Token验证失败");
        }
    }
}